transform: Don't crash for gsk_transform_transform (id, id)
authorBenjamin Otte <otte@redhat.com>
Fri, 21 Feb 2020 17:30:13 +0000 (18:30 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 21 Feb 2020 17:30:13 +0000 (18:30 +0100)
See attached tests

gsk/gsktransform.c
testsuite/gsk/transform.c

index 19aa543b23b09a615b76ca76b3c098314d5e4af3..2d94d7e7a550c5d00b0c3042f35a553d829a3cae 100644 (file)
@@ -1624,8 +1624,10 @@ gsk_transform_transform (GskTransform *next,
 
   if (gsk_transform_is_identity (next))
     {
+      /* ref before unref to avoid catastrophe when other == next */
+      other = gsk_transform_ref (other);
       gsk_transform_unref (next);
-      return gsk_transform_ref (other);
+      return other;
     }
 
   next = gsk_transform_transform (next, other->next);
index 71ade76a491058d4be1bf505c04c15c29079a198..b90e4f4bc070db6681ed1afcdda8dda92e0dd1f0 100644 (file)
@@ -336,12 +336,30 @@ static void
 test_identity_equal (void)
 {
   GskTransform *id = gsk_transform_new ();
+  GskTransform *t;
 
   g_assert_true (gsk_transform_equal (NULL, NULL));
   g_assert_true (gsk_transform_equal (id, NULL));
   g_assert_true (gsk_transform_equal (NULL, id));
   g_assert_true (gsk_transform_equal (id, id));
 
+  t = gsk_transform_transform (NULL, NULL);
+  g_assert_true (gsk_transform_equal (t, NULL));
+  gsk_transform_unref (t);
+  t = gsk_transform_transform (gsk_transform_new (), NULL);
+  g_assert_true (gsk_transform_equal (t, NULL));
+  gsk_transform_unref (t);
+  t = gsk_transform_transform (NULL, id);
+  g_assert_true (gsk_transform_equal (t, NULL));
+  gsk_transform_unref (t);
+  t = gsk_transform_transform (gsk_transform_new (), id);
+  g_assert_true (gsk_transform_equal (t, NULL));
+  gsk_transform_unref (t);
+  t = gsk_transform_new ();
+  t = gsk_transform_transform (t, t);
+  g_assert_true (gsk_transform_equal (t, NULL));
+  gsk_transform_unref (t);
+
   gsk_transform_unref (id);
 }
 
@@ -394,6 +412,7 @@ main (int   argc,
   g_test_add_func ("/transform/conversions/simple", test_conversions_simple);
   g_test_add_func ("/transform/conversions/transformed", test_conversions_transformed);
   g_test_add_func ("/transform/identity", test_identity);
+  g_test_add_func ("/transform/identity-equal", test_identity_equal);
   g_test_add_func ("/transform/invert", test_invert);
   g_test_add_func ("/transform/print-parse", test_print_parse);